﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using BussinessLogicTecnoPez.AtencionCliente.Ventas;
using Tecnopez.Globals;
using BussinessLogicTecnoPez.AtencionCliente.Pedido;
using BussinessLogicTecnoPez.Produccion.Enfermedades_y_control_de_estanques;
using BussinessLogicTecnoPez.Tipos_Comunes;
using BussinessLogicTecnoPez.AtencionCliente.Cliente;
using System.Transactions;
using BussinessLogicTecnoPez;

public partial class Modules_Ventas_ABMCobros : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        GenericMasterPage master = (GenericMasterPage)this.Master;
        master.Imagen = "../Styles/Icons/db_add.png";
        master.Titulo = "Gestión de cobros.";

        IncializarPopUps();

        cmdEliminar.OnClientClick = "return confirm('Esta seguro de eliminar el registro?');";

        grdPrincipal.setupGrid(typeof(Cobro), cargarGrilla, false, true, ViewState);

        if (!IsPostBack)
        {
            this.SetMode(PageMode.ListMode);
        }
    }

    private void IncializarPopUps()
    {
        popBuscarCliente.ObjType = typeof(Cliente);
        popBuscarFormaDePago.ObjType = typeof(FormaDePago);
        popBuscarPedido.ObjType = typeof(Pedido);
        popEmpleado.ObjType = typeof(Empleado);
        popFormaDePago.ObjType = typeof(FormaDePago);
        popPedido.ObjType = typeof(Pedido);
    }


    private void cargarGrilla()
    {
        Cobro.getManager.ClearFilters();
        Cobro.getManager.ClearOrders();
        if (ViewState[grdPrincipal.PageDataViewOrderKey] == null)
        {
            Cobro.getManager.AddOrder("idcobro",
                GenericManager<Cobro>.Order.orderDirection.DESC);
        }
        else
        {
            Cobro.getManager.AddOrder(ViewState[grdPrincipal.PageDataViewOrderKey].ToString(),
                (GenericManager<Cobro>.Order.orderDirection)ViewState[grdPrincipal.PageDataViewOrdenDireccionKey]);
        }

        DateTime fechaHasta, fechaDesde;
        if (DateTime.TryParse(dtFechaDesde.Text, out fechaDesde))
        {
            Cobro.getManager.AddFilter("fecha", GenericManager<Cobro>.filterOperator.BiggerEqualsThan, fechaDesde);
        }
        if (DateTime.TryParse(dtFechaHasta.Text, out fechaHasta))
        {
            Cobro.getManager.AddFilter("fecha", GenericManager<Cobro>.filterOperator.SmallerEqualsThan, fechaHasta);
        }
        Pedido ped = popBuscarPedido.ItemSelected as Pedido;
        if (ped != null)
        {
            Cobro.getManager.AddFilter("pedido", GenericManager<Cobro>.filterOperator.Equals, ped.IdPedido);
        }
        FormaDePago formaPago = popBuscarFormaDePago.ItemSelected as FormaDePago;
        if (formaPago != null)
        {
            Cobro.getManager.AddFilter("formaDePago", GenericManager<Cobro>.filterOperator.Equals, formaPago.IdFormaDePago);
        }
        Cliente cliente = popBuscarCliente.ItemSelected as Cliente;
        if (cliente != null)
        {
            Cobro.getManager.AddFilterIN("pedido", cliente.obtenerTodosLosPedidos());
        }
        Cobro.getManager.AddFilter("baja", GenericManager<Cobro>.filterOperator.Equals, null);

        grdPrincipal.DataSource = Cobro.getManager.GetFilter();
        grdPrincipal.DataBind();
    }


    private PageMode getMode()
    {
        if (ViewState["PageMode"] == null)
            return PageMode.ModeNotFound;
        return (PageMode)ViewState["PageMode"];
    }


    private void SetMode(PageMode mode)
    {
        ViewState["PageMode"] = mode;
        switch (mode)
        {
            case PageMode.ListMode:
                multiPrincipal.ActiveViewIndex = 0;
                break;
            case PageMode.NewMode:
                multiPrincipal.ActiveViewIndex = 1;

                Functions.setearReadOnly(false, txtMonto, txtObservaciones);

                popEmpleado.Enable = true;
                popFormaDePago.Enable = true;
                popPedido.Enable = true;

                popEmpleado.ItemSelected = null;
                popFormaDePago.ItemSelected = null;
                popPedido.ItemSelected = null;

                txtMonto.Text = "";
                dtFecha.Text = DateTime.Now.ToShortDateString();
                txtObservaciones.Text = "";
                txtCodigo.Text = "";

                dtFecha.Enabled = true;

                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;

                break;
            case PageMode.EditMode:
                multiPrincipal.ActiveViewIndex = 1;

                Functions.MessageBox("Modo no implementado.", this);

                cmdAceptar.Visible = true;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = false;
                cmdEliminar.Enabled = false;
                break;
            case PageMode.ViewMode:
                multiPrincipal.ActiveViewIndex = 1;

                Functions.setearReadOnly(true, txtObservaciones, txtMonto);

                popEmpleado.Enable = false;
                popFormaDePago.Enable = false;
                popPedido.Enable = false;

                dtFecha.Enabled = false;

                cmdAceptar.Visible = false;
                cmdCancelar.Enabled = true;
                cmdEditar.Enabled = true;
                cmdEliminar.Enabled = true;
                break;
        }

    }

    protected void grdPrincipal_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (grdPrincipal.Rows[0].Cells[0].Text == "&nbsp;")
        {
            Functions.MessageBox("No hay elementos en la grilla.", this);
            return;
        }
        if (e.CommandName == "ver")
        {

            int idCobro = int.Parse(grdPrincipal.DataKeys[System.Convert.ToInt32(e.CommandArgument)].Value.ToString());
            Cobro objCobro = Cobro.getManager.GetOneByPrimaryKey(idCobro);
            if (objCobro != null)
            {
                txtCodigo.Text = objCobro.IdCobro.ToString();
                txtMonto.Text = objCobro.Monto.ToString();
                txtObservaciones.Text = objCobro.Observaciones;
                popEmpleado.ItemSelected = objCobro.Empleado;
                popFormaDePago.ItemSelected = objCobro.FormaDePago;
                popPedido.ItemSelected = objCobro.Pedido;

                SetMode(PageMode.ViewMode);
            }
            else
            {
                Functions.MessageBox("No se puede mostrar el item.", this);
            }
        }
    }



    protected void cmdNuevo_Click(object sender, EventArgs e)
    {
        this.SetMode(PageMode.NewMode);
    }
    protected void cmdEditar_Click(object sender, EventArgs e)
    {
        this.SetMode(PageMode.EditMode);
    }
    protected void cmdCancelar_Click(object sender, EventArgs e)
    {
        this.SetMode(PageMode.ListMode);
    }
    protected void cmdAceptar_Click(object sender, EventArgs e)
    {
        if (IsValid)
        {
            DateTime fecha;
            if (validar(out fecha))
            {
                if (getMode() == PageMode.NewMode)
                {
                    Cobro cob = new Cobro();
                    cob.Empleado = popEmpleado.ItemSelected as Empleado;
                    cob.Fecha = fecha;
                    cob.FormaDePago = popFormaDePago.ItemSelected as FormaDePago;
                    cob.Monto = Convert.ToDecimal(txtMonto.Text);
                    cob.Observaciones = txtObservaciones.Text;
                    Pedido ped = popPedido.ItemSelected as Pedido;
                    using (TransactionScope transaccion = new TransactionScope())
                    {
                        ped = Pedido.getManager.GetOneByPrimaryKey(ped.IdPedido); //refresco los datos del pedido.
                        cob.Pedido = ped;
                        ped.MontoPagado += cob.Monto;
                        if (Cobro.getManager.Insert(cob)
                            && Pedido.getManager.Update(ped))
                        {
                            cargarGrilla();
                            transaccion.Complete();
                            Functions.MessageBox("El cobro número " + cob.IdCobro + " fue registrado.", this);
                            this.SetMode(PageMode.ListMode);
                        }
                    }
                }
                else
                {
                    Functions.MessageBox("Este formulario no admite esta opcion en este estado.", this);
                }
            }
        }
    }

    private Boolean validar(out DateTime fecha)
    {
        bool result = false;
        if (DateTime.TryParse(dtFecha.Text, out fecha))
        {
            Pedido p = popPedido.ItemSelected as Pedido;
            if (p != null)
            {
                if (p.TipoEstadoPedido.IdTipoEstadoPedido !=
                    (int)BussinessLogicTecnoPez.Tipos_Comunes.TipoEstadoPedido.TiposEstadosPedidos.Anulado)
                {
                    decimal monto = Convert.ToDecimal(txtMonto.Text);
                    if (monto > p.saldo)
                    {
                        Functions.MessageBox("El monto a pagar es superio al saldo del pedido. El sado es $" + p.saldo.ToString(), this);
                    }
                    else
                    {
                        result = true;
                    }
                }
                else
                {
                    Functions.MessageBox("No puede abonar un pedido anulado.", this);
                }
            }
            else
            {
                Functions.MessageBox("Debe seleccionar un pedido.", this);
            }
        }
        else
        {
            Functions.MessageBox("La fecha no es válida", this);
        }
        return result;
    }
    protected void cmdBuscar_Click(object sender, EventArgs e)
    {

    }
    protected void cmdEliminar_Click(object sender, EventArgs e)
    {
        Int32 idCobro;
        if (Int32.TryParse(txtCodigo.Text, out idCobro))
        {
            Cobro objCobro = Cobro.getManager.GetOneByPrimaryKey(idCobro);
            if (objCobro != null)
            {
                using (TransactionScope transaccion = new TransactionScope())
                {
                    objCobro.Baja = "S";
                    if (Cobro.getManager.Update(objCobro))
                    {
                        objCobro.Pedido.MontoPagado -= objCobro.Monto;
                        if (Pedido.getManager.Update(objCobro.Pedido))
                        {
                            transaccion.Complete();
                            Functions.MessageBox("Se procedio la baja del cobro con éxito.", this);
                            SetMode(PageMode.ListMode);
                        }
                        else
                        {
                            Functions.MessageBox("No se pudo editar el pedido. No se dio de baja.", this);
                        }
                    }
                    else
                    {
                        Functions.MessageBox("No se puede cancelar el cobro", this);
                    }
                }
            }
        }
        else
        {
            Functions.MessageBox("error en el formulario", this);
        }
    }
}
